今天是鐵人賽的第三天,總算是要開始寫扣囉~因為今年打算更專注在實作 Shell,而且 Go 很好學,所以不會像去年一樣再把 Go 語法講過一次,如果你對 Go 不太熟的話可以參考我去年的 Go 語法 I 到 Go 語法 III,應該就能看懂底下的實作
不知道各位有沒有聽過這句話「電腦科學領域中最難的兩件事:快取失效和命名」
There are only two hard things in Computer Science: cache invalidation and naming things.
但要開發一個 Shell 總得給它取個名字吧,因為是用 Go 寫的 Shell 所以乾脆就直接叫 Gosh,聽起來比 zsh 什麼的有氣勢多了。之後的程式碼也都會放在 Github 上 Larry850806/Gosh,歡迎大家 clone 下來編譯跑跑看
因為 Shell 讀取指令是一行一行讀的,今天要做到最基本的逐行讀取指令並且 echo 出來
bufio.NewReader
bufio
是 Go 裡面專門在處理讀取跟寫入的 package,他的 bufio.NewReader
可以用來把輸入源(譬如說使用者輸入)轉成 bufio.Reader
型別,這個型別 支援很多進階的讀取操作
(bufio.Reader) ReadString
bufio.Reader
這個型別的變數有一個 function 叫做 ReadString
可以用,它可以用來分段讀取,譬如說以換行字元 \n
做為分隔進行讀取,那就可以做到逐行讀取的功能
strings.TrimSpace
strings
是專門用來處理字串的 package,其中的 strings.TrimSpace
可以用來去除字串頭尾多餘的空白
func main() {
// 把使用者輸入轉換成 bufio.Reader 型別
stdin := bufio.NewReader(os.Stdin)
for {
// 簡單的 prompt
fmt.Print("> ")
// 逐行讀取使用者輸入,並且去除頭尾的空白
input, _ := stdin.ReadString('\n')
input = strings.TrimSpace(input)
// 輸出
fmt.Println(input)
}
}
首先把使用者的輸入 os.Stdin
轉成 bufio.Reader
型別,然後用個無窮迴圈不斷讀取使用者輸入,並輸出一樣的內容
目前已經有點 Shell 的樣子了~其實沒有想像中難對吧,今天的 commit 放在 這裡,有任何問題歡迎在下方留言,沒問題的話明天就要來實作執行指令的部分囉